#include "heditor.h"

extern int ancho;
extern int alto;
extern Rejilla* rej;
extern int tPunto;
Rejilla *insertar;
int insertando=0;


void setWindow(float left, float right, float bottom, float top){
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(left, right, bottom, top);
	}

void setViewport(int left, int right, int bottom, int top){
	glViewport(left, bottom, right - left, top - bottom);
	}

void inicio(int argc, char **argv, int anc, int alt){
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(anc, alt);
	glutInitWindowPosition(150, 150);
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glutCreateWindow("Editor Conway");
	glutDisplayFunc(miDibujo);
	glutMouseFunc(miRaton);
	crearMenu();
	setWindow(0.0, anc, 0.0, alt);
	glPointSize(tPunto);
	}

void miRaton(int boton, int estado, int x, int y){
	
	if(boton == GLUT_LEFT_BUTTON && estado == GLUT_DOWN && !insertando)
 		rej->flipElemento((int)y/tPunto, (int)x/tPunto);
	else if(insertando){
		
			int err = rej->mapearRejilla(*insertar, (unsigned int)y/tPunto, (unsigned int)x/tPunto);
				
			if(!err)
				cout << "Posición incorrecta." << endl;
			
			insertando = 0;

			delete insertar;
		}

	glutPostRedisplay();
	}

void miDibujo(){

	glClear(GL_COLOR_BUFFER_BIT);

	for(int i=0; i<rej->getAlto(); i++){
			for(int j=0; j<rej->getAncho(); j++){
				
				if(rej->getElemento(i,j))
					glColor3f(1.0, 1.0, 1.0);
				else
					glColor3f(0.0, 0.0, 0.0);

				glBegin(GL_POINTS);
					glVertex2i((j*tPunto)+tPunto/2, (((rej->getAlto()-1)-i)*tPunto)+tPunto/2);
				glEnd();

				}
		}

	glFlush();
	}

void menuInsertar(GLint entrada){
	switch(entrada){
		case 0:
			insertar = new Rejilla("./templates/glider");
			break;
		case 1:
			insertar = new Rejilla("./templates/bomba");
			break; 
		}
	
	insertando = 1;
	}

void menu(GLint entrada){

	switch (entrada){
		case 0:
			glutReshapeWindow(ancho, alto);
			break;
		case 1:
			guardar();
			break;
		case 2:
			rej->ponerTodo(0);
			break;
		case 3:
			rej->ponerTodo(1);
			break;
		case 4:
			rej->invertir();
			break;
		case 5:
			rej->aleatoria();
			break;
		case 6:
			guardar();
			exit(-1);
			break;
		case 7:
			exit(-1);
			break;
		}

	glutPostRedisplay();
	}

void crearMenu(void){
	int menuID = glutCreateMenu(menuInsertar);
		glutAddMenuEntry("Glider (3x3)", 0);
		glutAddMenuEntry("Exploder (3x3)", 1);
	glutCreateMenu(menu);
		glutAddMenuEntry("Restaurar ventana", 0);
		glutAddMenuEntry("Volcar a fichero [nombre por consola]", 1);
		glutAddMenuEntry("Poner todo a 0", 2);
		glutAddMenuEntry("Poner todo a 1", 3);
		glutAddMenuEntry("Invertir", 4);
		glutAddMenuEntry("Aleatoria", 5);
		glutAddMenuEntry("Guardar y salir [nombre por consola]", 6);
		glutAddMenuEntry("Salir", 7);
		glutAddSubMenu("Insertar", menuID);
	glutAttachMenu(GLUT_RIGHT_BUTTON);
	}

void guardar(){
	string nombre;
	cout << "Nombre del fichero para guardar: ";
	cin >> nombre;
	rej->volcar(nombre);
	}

int calcTam(int an, int al){
	
	int max=50;
	int min=7;

	if(an >= al){
		if (an >= max-min)
			return min;
		else
			return max - an;
		}
	else if(an < al){
		if (al >= max-min)
			return min;
		else
			return max - al;
		}

	}